package ru.compft.common.data;

import org.springframework.util.CollectionUtils;
import ru.compft.common.data.meta.ModuleTableMeta;
import ru.compft.common.utils.GlobalConstants;

import javax.persistence.*;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

/**
 * User: VVasiliev
 * Date: 08.06.12
 * Time: 16:20
 * Класс представляющий объект "Модули системы"
 */
@Entity
@Table(name = ModuleTableMeta.TABLE_NAME)
public class Module implements Serializable, Comparable {
    private static final long serialVersionUID = 2132267522147373090L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = ModuleTableMeta.ID, unique = true, nullable = false)
    private Long id;

    @Column(name = ModuleTableMeta.CODE, unique = true, nullable = false)
    private String code; // Код модуля

    @Column(name = ModuleTableMeta.NAME, unique = true, nullable = false)
    private String name; // Название модуля

    @Column(name = ModuleTableMeta.DESCRIPTION)
    private String description; // Описание модуля

    @Column(name = ModuleTableMeta.VISIBLE, length = 1)
    private boolean visible; // Отображаемый

    @Column(name = ModuleTableMeta.POSITION_ORDER, unique = true, nullable = false)
    private int order; // Порядок при отображении

    @Transient
    private List<ModulePage> pageList; // Страницы модуля

    public Module() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

//    public String getPath() {
//        return path;
//    }
//
//    public void setPath(String path) {
//        this.path = path;
//    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public boolean isVisible() {
        return visible;
    }

    public void setVisible(boolean visible) {
        this.visible = visible;
    }

    public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }

    public List<ModulePage> getPageList() {
        return pageList;
    }

    public void setPageList(List<ModulePage> pageList) {
        this.pageList = pageList;
    }

    public void addPage(ModulePage page) {
        if (page != null) {
            if (getPageList() == null)
                setPageList(new LinkedList<ModulePage>());

            getPageList().add(page);
        }
    }

    /**
     * Страницы модуля в виде строки для отображения в таблицах
     *
     * @return
     */
    public String getPagesForView() {
        final StringBuilder builder = new StringBuilder();
        final List<ModulePage> modulePages = getPageList();
        if (!CollectionUtils.isEmpty(modulePages)) {
            final int size = modulePages.size();

            for (int i = 0; i < modulePages.size(); i++) {
                ModulePage page = modulePages.get(i);
                builder.append(page.getName())
                        .append(" ")
                        .append(GlobalConstants.LEFT_PARENTHESIS)
                        .append(page.getCode())
                        .append(GlobalConstants.RIGHT_PARENTHESIS);

                // после последней записи перевод строки не ставим
                if (i < (size - 1)) builder.append(GlobalConstants.EOL);
            }
        }
        return builder.toString();
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("Module");
        sb.append("{id=").append(id);
        sb.append(", code='").append(code).append('\'');
        sb.append(", name='").append(name).append('\'');
//        sb.append(", path='").append(path).append('\'');
        sb.append(", description='").append(description).append('\'');
        sb.append(", visible=").append(visible);
        sb.append(", order=").append(order);
        sb.append(", pages=").append(pageList);
        sb.append('}');
        return sb.toString();
    }

    @Override
    public int compareTo(Object o) {
        if (o != null && o instanceof Module) {
            Module module = (Module) o;
            return this.getOrder() > module.getOrder() ? 1 : (this.getOrder() < module.getOrder() ? -1 : 0);
        }
        return 1;
    }
}
